﻿using System;
using System.Collections.Generic;

namespace StockholmsStad.Data.Interfaces
{
    /// <summary>
    /// Generiskt interface för de vanligaste databasoperationerna (insert/update/delete etc)
    /// som använder sig av LINQ to SQL. 
    /// </summary>
    public interface IDataContextGeneric
    {
        /// <summary>
        /// Hämta objekt baserat på primärnyckel
        /// </summary>
        /// <typeparam name="T">Typ av objekt</typeparam>
        /// <param name="id">Primärnyckel att leta efter</param>
        /// <returns>Det objekt som matchar typen</returns>
        T SelectByPrimaryKey<T>(int id) where T : class;

        /// <summary>
        /// Hämta alla objekt för en viss typ
        /// </summary>
        /// <typeparam name="T">Typ av objekt</typeparam>
        /// <returns>Matchande tabell returnerat som en lista</returns>
        List<T> SelectAll<T>() where T : class;

        /// <summary>
        /// Hämta primärnyckelns typ
        /// </summary>
        /// <typeparam name="T">Typ av objekt</typeparam>
        /// <returns>Primärnyckelns typ</returns>
        Type GetPrimaryKeyType<T>() where T : class;

        /// <summary>
        /// Hämtar namnet på primärnyckeln
        /// </summary>
        /// <typeparam name="T">Typ av objekt</typeparam>
        /// <returns>Primärnyckelns namn</returns>
        string GetPrimaryKeyName<T>() where T : class;

        /// <summary>
        /// Sätt in ett objekt i en tabell
        /// </summary>
        /// <typeparam name="T">Typ av objekt</typeparam>
        /// <param name="item">Objektet som ska sättas in</param>
        void Insert<T>(T item) where T : class;

        /// <summary>
        /// Uppdatera ett existerande objekt
        /// </summary>
        /// <typeparam name="T">Typ av objekt</typeparam>
        /// <param name="item">Objektet som ska uppdateras</param>
        void Update<T>(T item) where T : class;

        /// <summary>
        /// Ta bort ett objekt
        /// </summary>
        /// <typeparam name="T">Typ av objekt</typeparam>
        /// <param name="item">Objektet som ska tas bort</param>
        void Remove<T>(T item) where T : class;

    }
}
